/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador.Service.Simulacion;

import Controlador.Bean.Produccion.DesempenoHistorico;
import Controlador.Bean.Simulacion.FlujoXproducto;
import Controlador.Bean.Simulacion.MaquinaS;
import Controlador.Bean.Simulacion.Trabajador;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;

/**
 *
 * @author Victor
 */
public class HiloAlgoritmo extends Thread{
    
    String mensaje;
    HashMap<String, Trabajador> trabajadores;
    HashMap<String, MaquinaS> maquinas;
    TreeMap<String,String> tipos;
    List<HashMap<String,Object>> planVentasOrig;
    HashMap<String,FlujoXproducto> flujosxProducto;
    List<String> turnos;
    ServicioSimulacion aux;
    HashMap<String,Integer> planProdXTurno;

    public HiloAlgoritmo(HashMap<String, Trabajador> trabajadores, HashMap<String, MaquinaS> maquinas, TreeMap<String, String> tipos, List<HashMap<String, Object>> planVentasOrig, HashMap<String, FlujoXproducto> flujosxProducto, List<String> turnos,HashMap<String,Integer> planProdXTurno,ServicioSimulacion aux) {
        this.trabajadores = trabajadores;
        this.maquinas = maquinas;
        this.tipos = tipos;
        this.planVentasOrig = planVentasOrig;
        this.flujosxProducto = flujosxProducto;
        this.turnos = turnos;
        this.aux=aux;
        this.planProdXTurno=planProdXTurno;
    }
    
     
    
    public void run()
    {
        AlgMemetico ALGORITMO= new AlgMemetico();  
        
        //Se pasan los datos a la clase que ejcuta el algoritmo
        ALGORITMO.setTrabajadores(trabajadores);//cada vez que se carga una nueva 
                                             //lista de trabajadores se activa un flag(aun no se utiliza)               
        ALGORITMO.setCodTrabajadoresOriginal(new ArrayList<>(trabajadores.keySet()));
         ALGORITMO.setPlanProdXTurno(planProdXTurno);
        ALGORITMO.setMaquinasDisponibles(maquinas);//cada vez que se carga una nueva lista de 
                                                //trabajadores se activa un flag                
        ALGORITMO.setTipoMaquinas(new ArrayList<>(tipos.keySet()));       
        ALGORITMO.setTurnos(turnos);
        HashMap<String,String>  maxResultado=null;
        Double  utMAx=null;       

        for(int i=0;i<2;i++){  
        //Se pasan los datos a la clase que ejecuta el algoritmo                
        HashMap<String,String> resultado;     
        try{        
           Date inicio= new Date();
           resultado=ALGORITMO.ALG01(300, 0.8, 2500,0.65);
           Double utActual=Double.valueOf(ALGORITMO.funcionUtilidad(resultado));
           if(resultado!=null && utActual.compareTo(0.0)>0 ){
           if(maxResultado==null ){
               utMAx=utActual;
               maxResultado=resultado;
           }
           else if(utMAx.compareTo(utActual)<0){
               utMAx=utActual;
               maxResultado=resultado;
           }
           }
           else {
           i--;
           continue;
           }
           Date fin= new Date();  
           long demora=fin.getTime()-inicio.getTime();
            
        }
        catch(Exception e){ 
            e.printStackTrace();
        }
      }  
      aux.actualizarMaximo(maxResultado, utMAx);
    }
     

    public void setMensaje(String msj)
    {
        this.mensaje = msj;

    }

    
}
